package com.baitengsoft.patentapimonitor.api.service.impl;


import com.baitengsoft.patentapimonitor.api.service.BaseService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.entity.Example;

import java.io.Serializable;
import java.util.List;

/**
 * baseService  通用的service
 * <p>Title: BaseService</p>
 * <p>Description: </p>
 * <p>Company: </p> 
 * @author
 * @date
 * @version 1.0
 */
@Service
public abstract class BaseServiceImpl<T> implements BaseService<T>{
	//加载子类之前首先需要加载父类的实例
	@Autowired
	public Mapper<T> mapper ;
	
	public Mapper<T> getMapper() {
		return mapper;
	}
	public void setMapper(Mapper<T> mapper) {
		this.mapper = mapper;
	}

	/**
	 *  根据Id主键去查询
	 * <p>Title: queryById</p>
	 * <p>Description: </p>
	 * @param id 主键
	 * @return   查询到的对象
	 */
	public T queryById(Serializable id){
		return mapper.selectByPrimaryKey(id);
	}
	/**
	 *  查询所有
	 * <p>Title: queryAll</p>
	 * <p>Description: </p>
	 * @return 集合
	 */
	public List<T> queryAll(){
		return mapper.select(null);
	}
	/**
	 * 根据条件查询,所给出的参数只能查询到一条的数据
	 * <p>Title: queryOne</p>
	 * <p>Description: </p>
	 * @param t 需要查询的条件
	 * @return  查询到的结果
	 */
	public T queryOne(T t){
	return mapper.selectOne(t);
	
	}
	/**
	 * 根据条件查询,所给出的参数可以查询到多条的数据
	 * <p>Title: queryListByWhere</p>
	 * <p>Description: </p>
	 * @param t 查询条件
	 * @return 查询到的数据的集合
	 */
	public List<T> queryListByWhere(T t){
		return mapper.select(t);
	}
	/**
	 * 根据条件查询,并且分页
	 * <p>Title: queryPageListByWhere</p>
	 * <p>Description: </p>
	 * @param pageNum 第几页
	 * @param pageSize 每页显示的长度
	 * @param t       查询条件
	 * @return		     查询到的数据
	 */
	@SuppressWarnings("static-access")
	public PageInfo<T> queryPageListByWhere(Integer pageNum,Integer pageSize,T t){
		PageHelper help = new PageHelper();
		help.startPage(pageNum, pageSize);
		List<T> select = mapper.select(t);
		PageInfo<T> info = new PageInfo<>(select);
		return info;
	}
	/**
	 * 保存,且为null的值也保存
	 * <p>Title: sava</p>
	 * <p>Description: </p>
	 * @param t 需要保存的对象
	 * @return  1.表示保存成功  0.表示保存失败
	 */
	public Integer sava(T t){
		int insert = mapper.insert(t);
		return insert;
	}
	/**
	 *  保存,只保存不为空的值 建议使用
	 * <p>Title: saveByNotNull</p>
	 * <p>Description: </p>
	 * @param t 需要保存的对象
	 * @return 1.表示保存成功  0.表示保存失败
	 */
	public Integer saveByNotNull(T t){
		return mapper.insertSelective(t);
	}
	/**
	 * 根据更新,要求主键不能为null 所有的字段进行更新
	 * <p>Title: update</p>
	 * <p>Description: </p>
	 * @param t
	 * @return 1.表示更新成功  0.表示更新失败
	 */
	public Integer update(T t){
		return mapper.updateByPrimaryKey(t);
	}
	/**
	 * 根据更新,要求主键不能为null 不为null的字段进行更新
	 * <p>Title: updateByNotNull</p>
	 * <p>Description: </p>
	 * @param t 
	 * @return 1.表示更新成功  0.表示更新失败
	 */
	public Integer updateByNotNull(T t){
		return mapper.updateByPrimaryKeySelective(t);
	}
	/**
	 *  根据主键删除
	 * <p>Title: deleteById</p>
	 * <p>Description: </p>
	 * @param id 需要删除的主键的值
	 * @return 1.表示删除成功  0.表示删除失败
	 */
	public Integer deleteById(Serializable id){
		return mapper.deleteByPrimaryKey(id);
	}
	/**
	 *  根据给出的主键集合进行批量删除
	 * <p>Title: deleteByIds</p>
	 * <p>Description: </p>
	 * @param ids 主键的值
	 * @param properties 主键的名称
	 * @param clazz      对应实体的clazz的文件
	 * @return           如果为0表示删除失败 大于0表示删除成功
	 */
	public Integer deleteByIds(List<Object> ids,String properties,Class<T> clazz){
		Example example = new Example(clazz);
		example.createCriteria().andIn(properties, ids);
		return mapper.deleteByExample(example);
	}
	/**
	 *  根据条件删除
	 * <p>Title: deleteByWhere</p>
	 * <p>Description: </p>
	 * @param t 
	 * @return  如果为0表示删除失败 大于0表示删除成功
	 */
	public Integer deleteByWhere(T t){
		return mapper.delete(t);
	}
}
